【小ネタ】CloudWatch Logsの料金が高かったのでAWS CLIを使って調査した話
西澤です。CloudWatch Logsは非常に便利で強力なサービスですが、ログ量が多くなる場合は課金に注意が必要です。今回AWS CLIで調査する機会があったので、その際の対応について簡単にまとめておきます。
CloudWatch Logsの料金(おさらい)
2020年2月時点での東京リージョンでのCloudWatch Logsの利用料金は以下のとおりです。
バージニアリージョンの料金が記載されているとの指摘を受けまして、下記料金を東京リージョンの最新の料金情報に合わせて訂正いたしました。大変申し訳ありません。
- $0.76 : 取り込み GB あたり
- $0.033 : GB あたりのアーカイブ/月
エクスポート時のデータ転送料金は置いておくと、"アーカイブ"の方はS3料金と大差がありませんが、問題となるのは"取り込みGBあたり"のところです。これが若干割高となっていますので、ログ量が多い場合に注意が必要です。
AWS CLIでLogGroupあたりの取り込みサイズを確認した
今回はこんなbashスクリプトを用意して調べてみました。CloudWatchの情報を取得する際の日付指定がいつも調べなければわからなかったので、Mac用とLinux用とdateコマンドをどちらも使えるようにしたのと、--statistics "Sum"
にして、1日分をまとめつつ日付順にソートするあたりをAWS CLIを駆使して工夫しました。
#!/bin/bash ### AWS認証情報は設定済の前提 ### 何日分遡って確認するかを指定 DAYSAGO=3 ### MacかLinuxかの判定 if [ "$(uname)" == 'Darwin' ]; then OS='Mac' elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then OS='Linux' else echo "Your platform ($(uname -a)) is not supported." exit 1 fi ### LogGroupの一覧を取得 LOG_GROUPS=$(aws cloudwatch list-metrics \ --namespace "AWS/Logs" \ --metric-name "IncomingLogEvents" \ --query "Metrics[].Dimensions[?Name==\`LogGroupName\`].Value" \ --output text) ### LogGroup単位で前日分からDAYSAGOに指定した日数だけ処理する for LOG_GROUP in ${LOG_GROUPS} do ENDDAY=0 STARTDAY=$((ENDDAY+${DAYSAGO})) ### MacとLinuxでdateコマンドのオプションを指定 if [ "${OS}" == "Mac" ]; then STARTTIME="$(date -u -v-${STARTDAY}d +%Y-%m-%dT00:00:00Z)" ENDTIME="$(date -u -v-${ENDDAY}d +%Y-%m-%dT00:00:00Z)" else STARTTIME="$(date -u --date "${STARTDAY} days ago" +%Y-%m-%dT00:00:00Z)" ENDTIME="$(date -u --date "${ENDDAY} days ago" +%Y-%m-%dT00:00:00Z)" fi ### LogGroupごとに1日分のIncomingBytesの合計を出力 echo "### LogGroup: ${LOG_GROUP} ###" aws cloudwatch get-metric-statistics \ --namespace "AWS/Logs" \ --dimensions Name=LogGroupName,Value="${LOG_GROUP}" \ --metric-name "IncomingBytes" \ --statistics "Sum" \ --start-time "${STARTTIME}" \ --end-time "${ENDTIME}" \ --period 86400 \ --query "reverse(sort_by(Datapoints,&Timestamp)[?Sum>\`0\`].{Sum:Sum,Timestamp:Timestamp})" \ --output text done
- 出力サンプル
$ ./get_cloudwatch_logs_incomingbytes_sum.sh ### LogGroup: LogGroupNameA ### 342.0 2016-12-28T00:00:00Z 342.0 2016-12-27T00:00:00Z 343.0 2016-12-26T00:00:00Z ### LogGroup: LogGroupNameB ### 2586.0 2016-12-28T00:00:00Z 2586.0 2016-12-27T00:00:00Z 2586.0 2016-12-26T00:00:00Z ### LogGroup: LogGroupNameC ### 179374.0 2016-12-28T00:00:00Z 196992.0 2016-12-27T00:00:00Z 171424.0 2016-12-26T00:00:00Z
まとめ
CloudWatchの情報をAWS CLIから取得する時に、毎度調べながらやっている状況だったので、未来の自分の為にまとめてみました。もちろんAWS Management Consoleでも参照はできるんですが、データとして情報をまとめて欲しいときは、コマンドラインから情報を取得したいですよね。
特に目を引くようなトピックでなくても、休みの空いた時間を使って記録ををブログにしていきますよ。どこかの誰かのお役に立てば嬉しいです。